package com.zhi.mbtibot.controller;

import com.baidubce.qianfan.Qianfan;
import com.baidubce.qianfan.core.builder.ChatBuilder;
import com.baidubce.qianfan.model.chat.ChatResponse;
import com.zhi.mbtibot.common.Result;
import com.zhi.mbtibot.entity.Message;
import com.zhi.mbtibot.service.MessageService;
import com.zhi.mbtibot.service.UserService;
import com.zhi.mbtibot.util.TokenUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 功能:
 * 作者:YukiSu
 * 日期:2024/7/17 9:53
 */
@Slf4j
@RestController
@RequestMapping("/demo")
public class DemoController {
    Qianfan qianfan = new Qianfan("ALTAKTCmCV20XHjNG6SwiwV0hD", "b3e11d78f2724a2fa9fc09b5f60ea31a");
    ChatBuilder builder = qianfan.chatCompletion().model("ERNIE-Speed-128K");

    @Autowired
    TokenUtil tokenUtil;
    @Autowired
    UserService userService;
    @Autowired
    MessageService messageService;
    @Autowired
    HttpServletRequest request;

    //初始化导入所有信息

    @Autowired
    List<Message> messageList;
    boolean firstFlag = true;

    @PostMapping("/chat")
    Result sendMessageTest(@RequestParam String message, HttpServletRequest request) {
        //第一次发起对话
        if (firstFlag) {
            builder = qianfan.chatCompletion().model("ERNIE-Speed-128K");
            String token = request.getHeader("token");
            String username = tokenUtil.parseToken(token).get("username");
            Integer uid = userService.getUserByUserName(username).getUid();
            messageList = messageService.getMessageListByUid(uid);
            for (Message msg : messageList) {
                builder.addMessage(msg.getRole(), msg.getContent());
            }
            firstFlag = false;
        }

        builder.addMessage("user", message);
        ChatResponse response = builder.execute();
        builder.addMessage("assistant", response.getResult());

        String token = request.getHeader("token");
        String username = tokenUtil.parseToken(token).get("username");
        Integer uid = userService.getUserByUserName(username).getUid();
        messageService.addMessage(new Message(uid, messageService.getLastMessageNo(uid) + 1, "user", message));
        messageService.addMessage(new Message(uid, messageService.getLastMessageNo(uid) + 1, "assistant", response.getResult()));
        return Result.success(response.getResult());

    }
    @DeleteMapping("/chat")
    Result clearMessage(HttpServletRequest request) {
        Integer uid = userService.getUserByUserName(tokenUtil.parseToken(request.getHeader("token")).get("username")).getUid();
        messageService.deleteMessageListByUid(uid);

        builder = qianfan.chatCompletion().model("ERNIE-Speed-128K");
        firstFlag = true;

        return Result.success("成功重新开始对话");
    }

    @PostMapping("/test")
    Result demoChat(@RequestParam String message) {
        builder = qianfan.chatCompletion().model("ERNIE-Speed-128K");
        String prompt = """
                # 设定
                你是一个占卜大师,心理学家，精通算命以及占卜，对于人的心理学有颇为深入的研究.
                # 任务
                你需要根据用户的{MBTI}即MBTI性格以及{birthday}即生日进行科学的占卜.然后生成一份对于用户未来的预测.内容应当根据用户的这两个属性，推断出用户的更多信息与属性，类似于用户的星座与五行等，然后根据这些属性结合神学(塔罗牌),哲学,心理学,道家文化等知识为用户生成对未来的预测
                # 要求
                1. 结合心理知识进行合理的分析，内容可以有非常大的夸大成分
                2.内容需要让用户体会到**情绪价值**
                3. 内容可以引导用户思考积极的方向，即使最后结果不是特别理想，也一定有解决方法。
                4.内容应当编造的**真实可信，有理有据，令人信服**

                # 推导过程
                5.内容要尽量的具体，类似于“去做某件事会带来好运”或“做某件事可以避免灾难”的提示。\s
                6.内容要**紧密地围绕{MBTI}即MBTI性格与{birthday}}即生日进行分析**，可以通过用户这两个属性推断出类似**星座**，**五行属性**，**生活中的癖好**等信息，这里需要**你进行拓展**
                7.根据你在**第6点**推出的属性对用户进行详细的剖析
                8.可以通过类似于**侧写(即侦探与警察推断犯人的方式)**的方式对用户进行分析，然后对用户进行推测
                9.得出具体的结论与带有感情色彩的分析
                10.内容的情节要尽可能的具体,具体程度达到类似于**后天你可能会遇上命中注定之人**这样的程度

                # 注意点
                1.你所预测的结果**完全符合社会的道德以及相关的法律法规**
                2.你所提供的内容**十分精彩,类似于小说剧情一般**
                3.内容要**让用户愿意认真思考和实践。让我们一步一步来思考**
                4.你回答的口吻要像是一个**神棍**,而不是**人工智能助手**
                现在开始，我将会输入**个人信息**
                结果可以结合紫微斗数
                注意！**我输入的信息内如果不包含MBTI或者生日类的信息，请勿返回包括它们的结果**
                你将要保持占卜师的口吻回答我的问题""";
        if (firstFlag) {
            builder.addMessage("user", prompt);
            builder.addMessage("assistant", "好的我明白了。我将按照你的指示");
        }
        builder.addMessage("user", message);
        ChatResponse response = builder.execute();
        builder.addMessage("assistant", response.getResult());
        return Result.success(response.getResult());
    }



}